Many applications written in object-oriented computer programming languages such as C++ and Java include an object/relational application program interface (O/R API) for accessing relational databases. The O/R API provides an interface for mapping between an application program and the database protocol. A standard protocol for accessing databases is structured query language (SQL). SQL includes features that allow users to query, update, insert data into, and delete data from a database. For example, when a program written in the Java programming language requires access to a database, the program can employ the JDBC Application Program Interface (JDBC API) and its associated drivers. Through JDBC, programs written in the Java programming language may access a database using standard SQL queries. More specifically, a Java-program can use JDBC to establish a connection with a database, send SQL statements to the database, process a result from the database and return a result to the program.
Relational databases typically represent data in tabular format whereas object-oriented languages represent data as graphs of interconnected objects. When reading data, the O/R API must decide which parts of an object graph to query from the database without knowing exactly how that data will be used. This usually leads to the O/R API reading more data than is needed by the program using the data and causes performance problems. To address these performance problems, developers can manually program the O/R API to read specific parts of the object graph. This manual annotation of the O/R API is very labor-intensive, error prone, and usually is only done to address the most serious performance problems.